﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml.Serialization;
using System.IO;
using ClassLibraryEntidades;

namespace SerializaRutasSimuladas
{
    public partial class FromImagen : Form
    {

        private Dictionary<string, Ruta> dictionaryBusquedas = null;

        enum TipoIntruduccionRutas
        {
            Ninguno,
            Simple,
            PorDireccion
        }

        private TipoIntruduccionRutas tipoIntroduccionRutas=TipoIntruduccionRutas.Ninguno;

        
        private RutaSimulada ruta;


        private FormDirecciones formDirecciones;

        private List<Point> puntosTemporales = new List<Point>(20);
        

        public FromImagen()
        {
            InitializeComponent();
            formDirecciones = new FormDirecciones();
        }


        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {

            switch (tipoIntroduccionRutas)
            {
                case TipoIntruduccionRutas.Simple:
                    ruta.Coordendas.Add(new Coordenada(e.X,e.Y));
                    MessageBox.Show("Coordenada guardada");
                    break;

                case TipoIntruduccionRutas.PorDireccion:
                    
                    formDirecciones.coorX = e.X;
                    formDirecciones.coorY = e.Y;
                    puntosTemporales.Add(new Point(e.X, e.Y));
                    this.pictureBox1.Invalidate();
                    formDirecciones.Show();
                    break;
                default:
                    break;
            }
            
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            
        }


        private void generarFicheroXMLToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                XmlSerializer xs = new XmlSerializer(typeof(RutaSimulada));
                FileStream fs = new FileStream(saveFileDialog1.FileName + ".xml", FileMode.CreateNew);
                xs.Serialize(fs, ruta);
                fs.Close();

                MessageBox.Show("Su fichero XML ha sido generado correctamente");
            }
        }

        private void CrearNuevaRutaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            tipoIntroduccionRutas = TipoIntruduccionRutas.Simple;

            ruta = new RutaSimulada();
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image = new Bitmap(openFileDialog1.FileName);
                MessageBox.Show("Comience a clickar en los puntos que formarán su ruta");
            }

            
        }



        private void porDireccionesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            tipoIntroduccionRutas = TipoIntruduccionRutas.PorDireccion;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image = new Bitmap(openFileDialog1.FileName);
                MessageBox.Show("Comience a clickar en los puntos que formarán su ruta");
            }
        }

        private void cargarExistenteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            

            openFileDialog1.Title = "Seleccione la imagen que será su mapa";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image = new Bitmap(openFileDialog1.FileName);

                openFileDialog1.Title = "Seleccione el fichero con las rutas";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    this.dictionaryBusquedas=ControlRutas.Instance.Cargar_fichero_busquedas(this.openFileDialog1.FileName);
                    tipoIntroduccionRutas = TipoIntruduccionRutas.PorDireccion;
                    this.pictureBox1.Invalidate();
                    

                    MessageBox.Show("Comience a clickar en los puntos que formarán su ruta");
                    
                }
                else
                {
                    MessageBox.Show("Debe seleccionar el fichero con las rutas");
                    this.pictureBox1.Image = null;
                }

                
            }
        }



        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            base.OnPaint(e);

            Pen pen = new Pen(Color.Black, 2);

            if (tipoIntroduccionRutas == TipoIntruduccionRutas.PorDireccion && dictionaryBusquedas != null)
            {
                List<Nodo> nodos = null;
                foreach (Ruta ruta in dictionaryBusquedas.Values)
                {
                    nodos = ruta.DameNodos();
                    
                    foreach (Nodo n in nodos)
                    {
                        
                        e.Graphics.DrawEllipse(pen, n.coordenadas.x, n.coordenadas.y, 5, 5);
                    }
                    

                }
            }

            foreach (Point p in puntosTemporales)
            {
                e.Graphics.DrawEllipse(pen, p.X, p.Y, 5, 5);
            }
            
            pen.Dispose();
        }

        private void guardarFicheroToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                string path_fichero=ControlRutas.Instance.GuardarFicherbusquedas();
                MessageBox.Show("El fichero ha sido guardado correctamente en la direccion: " + path_fichero);
            }
            catch(Exception exc)
            {
                MessageBox.Show(exc.Message, "Error al intentar guardar el fichero");
            }
        }

        private void eliminarRutasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormEliminarRutas formEliminarRutas = new FormEliminarRutas();
            formEliminarRutas.dictionaryBusquedas = dictionaryBusquedas;
            formEliminarRutas.Show();
        }

        private void creditosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //FormInputBox f = new FormInputBox();
            //if(DialogResult.OK==f.ShowDialog())
            //    MessageBox.Show(f.InputText);

            puntosTemporales.Clear();
            this.pictureBox1.Invalidate();
        }


      
    }
}
